function myBind(context, ...args) {
  let fn = this
  let tmpFn = function () {
  }
  if (fn.prototype) {
    tmpFn.prototype = Object.create(fn.prototype)
  }

  let resultFn = function (...rest) {
    return fn.apply(this instanceof tmpFn ? this : context, [...args, ...rest])
  }
  // 纠正原型链
  resultFn.prototype = new tmpFn()
  return resultFn
}

Function.prototype.myBind = myBind

function Person(name, age) {
  console.log(name); //'我是参数传进来的name'
  console.log(age); //'我是参数传进来的age'
  console.log(this); //构造函数this指向实例对象
}
// 构造函数原型的方法
Person.prototype.say = function () {
  console.log(123);
}
let obj = {
  objName: '我是obj传进来的name',
  objAge: '我是obj传进来的age'
}
// 普通函数
function normalFun(name, age) {
  console.log(name);   //'我是参数传进来的name'
  console.log(age);   //'我是参数传进来的age'
  console.log(this); //普通函数this指向绑定bind的第一个参数 也就是例子中的obj
  console.log(this.objName); //'我是obj传进来的name'
  console.log(this.objAge); //'我是obj传进来的age'
}


// let bindFun = Person.myBind(obj, '我是参数传进来的name')
// let a = new bindFun('我是参数传进来的age')z
// a.say() //123


let bindFun = normalFun.myBind(obj, '我是参数传进来的name')
bindFun('我是参数传进来的age')
